package com.cskaoyan.javase.array._5operation._5copy;

import org.junit.Test;

import java.io.Serializable;
import java.util.Arrays;

/**
 * 数组的长度是不可以改变的
 *  arr是一个引用,指向堆上的一个长度为3的int数组对象
 *  这个长度为3的int数组对象,长度是不可变的,除非销毁它,不然它的长度始终都是3
 *  int[] arr = new int[3];
 *
 *  数组对象的长度不可变,但是引用可变
 *  arr是一个引用,指向堆上的一个长度为6的int数组对象
 *  arr = new int[6];
 *
 * 所以如果想要实现数组元素"真正意义上的"删除和新增，一般需要使用数组的拷贝。
 * 大致思路是，创建一个新数组,然后拷贝赋值：
 * 首先需要明确新数组的长度，初始化这个新数组。
 * 然后遍历原先的数组，过滤掉（或者新增）一些元素，给新数组赋值。
 *
 * @since 14:52
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    @Test
    public void test() {
        int[] arr = {1, 1, 0, 4, 5};
        int[] newArr = realInsertElementIntArr(arr, 6);
        System.out.println(Arrays.toString(newArr));

    }

    @Test
    public void test2() {
        int[] arr = {1, 1, 1};
        int[] newArr = realDeleteElementIntArr(arr, 1);
        System.out.println(Arrays.toString(newArr));
    }

    // 需求1: 该方法传入一个int数组,要求真正意义上新增一个元素
    /*
        分析:
            1.有没有可能直接在原先数组上做?   没有可能,数组长度不可变
            2.那么就需要创建一个新数组,来完成这个操作,新数组的长度是几? 老数组长度 + 1
            3.创建出新数组后,老数组的元素怎么办? 将老数组中的元素全部拷贝到新数组,然后再新增一个元素
     */
    public static int[] realInsertElementIntArr(int[] old, int aimElement) {
        // 1.创建新数组,新数组长度=老数组长度+1
        int[] result = new int[old.length + 1];
        // 2.将老数组中的元素拷贝到新数组,遍历老数组,因为老数组中的元素只是遍历但不改变,所以可以用增强for
        /*int index = 0;
        for (int oldEle : old) {
            result[index] = oldEle;
            index++;
        }*/
        for (int i = 0; i < old.length; i++) {
            result[i] = old[i];
        }
        // 新数组还有一个空位置,是最后一个位置
        // 3.将新增的元素赋值到新数组
        result[result.length - 1] = aimElement;
        return result;
    }

    // 需求2: 方法传入一个int数组,要求真正意义上删除某一个元素,注意这个元素个数不唯一,要求全部删除
    public static int[] realDeleteElementIntArr(int[] old, int aimElement) {
        // 1.计算目标元素的个数
        // 定义计数器count,从0开始
        int count = 0;
        for (int oldEle : old) {
            if (oldEle == aimElement) {
                count++;
            }
        }
        // 如果目标元素不存在,直接将老数组返回
        if (count == 0) {
            return old;
        }
        // 2.创建新数组,新数组的长度 = 老数组的长度 - 目标元素的个数
        int[] result = new int[old.length - count];
        // 3.遍历老数组,给新数组赋值,在赋值时将要删除的目标元素跳过,就相当于删除了元素
        int index = 0;
        for (int oldEle : old) {
            // 被删除的目标元素,需要跳过
            if (oldEle == aimElement) {
                continue;
            }
            // 非目标元素,将它赋值给新数组
            result[index] = oldEle;
            index++;
        }
        return result;
    }

}
